package condominio.dao;
// corregido TV [11AGO2011]

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Cuota;
import condominio.util.*;

public class CuotaDAO extends BaseDAO {
	
	public void insertarRegistroCuota (Cuota objCuota) throws DAOExcepcion {
		char chrAux;
		System.out.println("insertarRegistroCuota (Cuota objCuota)");
		String query = "INSERT INTO CUOTA (cuo_periodo, cuo_vivienda, cuo_importe, cuo_fch_vcto, cuo_estado, cuo_fch_pago) VALUES (?, ?, ?, ?, ?, ?)";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objCuota.getStrPeriodo());
			stmt.setInt(2, objCuota.getIntVivienda());
			stmt.setDouble(3, objCuota.getNumImporte());
			stmt.setString(4, objCuota.getStrFechaVcto());
			chrAux = objCuota.getChrEstadoCuota();
			stmt.setString(5, Character.toString(chrAux));
			stmt.setString(6, objCuota.getStrFechaPago());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("Error. No se pudo insertar registro en table CUOTA");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Cuota obtenerCuotaDAO(String pPeriodo, int pVivienda) throws DAOExcepcion {
		String strAux;
		System.out.println("obtenerCuota(String pPeriodo, int pVivienda)");
		Cuota objCuota = new Cuota();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT cuo_periodo, cuo_vivienda, cuo_importe, cuo_fch_vcto, cuo_estado, cuo_fch_pago FROM CUOTA WHERE cuo_periodo = ? AND cuo_vivienda = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, pPeriodo);
			stmt.setInt(2, pVivienda);
			
			rs = stmt.executeQuery();
			if (rs.next()) {
				objCuota.setStrPeriodo(rs.getString(1));
				objCuota.setIntVivienda(rs.getInt(2));
				objCuota.setNumImporte(rs.getDouble(3));
				objCuota.setStrFechaVcto(rs.getString(4));
				strAux = rs.getString(5);
				objCuota.setChrEstadoCuota(strAux.charAt(0));
				objCuota.setStrFechaPago(rs.getString(6));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objCuota;
	}

	public Collection<Cuota> buscarCuotasPorVivienda(int pCodVivienda) throws DAOExcepcion {
		String strAux;
//		System.out.println("buscarCuotasPorVivienda(int pCodVivienda)");
		String query = "SELECT cuo_periodo, cuo_vivienda, cuo_importe, cuo_fch_vcto, cuo_estado, cuo_fch_pago FROM CUOTA WHERE cuo_vivienda = ? ORDER BY cuo_periodo";
		Collection<Cuota> lista = new ArrayList<Cuota>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, pCodVivienda);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota objCuota = new Cuota();
				objCuota.setStrPeriodo(rs.getString(1));
				objCuota.setIntVivienda(rs.getInt(2));
				objCuota.setNumImporte(rs.getDouble(3));
				objCuota.setStrFechaVcto(rs.getString(4));
				strAux = rs.getString(5);
				objCuota.setChrEstadoCuota(strAux.charAt(0));
				objCuota.setStrFechaPago(rs.getString(6));
				lista.add(objCuota);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public void eliminarRegCuota(String pPeriodo, int pVivienda) throws DAOExcepcion {
		System.out.println("eliminarRegCuota(String pPeriodo, int pVivienda)");
		String query = "DELETE FROM CUOTA WHERE cuo_periodo = ? AND cuo_vivienda = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, pPeriodo);
			stmt.setInt(2, pVivienda);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar registro de CUOTA");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void registrarPagoCuota(Cuota pCuota) throws DAOExcepcion {
		char chrAux;
		System.out.println("registrarPagoCuota(String pPeriodo, int pVivienda)");
		String query = "UPDATE CUOTA SET cuo_estado = ?, cuo_fch_pago = ? WHERE cuo_periodo = ? AND cuo_vivienda = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			chrAux = pCuota.getChrEstadoCuota();
			stmt.setString(1, Character.toString(chrAux)); // dato a actualizar
			stmt.setString(2, pCuota.getStrFechaPago()); // dato a actualizar
			stmt.setString(3, pCuota.getStrPeriodo()); // filtro de seleccion
			stmt.setInt(4, pCuota.getIntVivienda()); // filtro de seleccion
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar datos del Pago en el registro de la Cuota, Periodo " + pCuota.getStrPeriodo() + " Vivienda " + pCuota.getIntVivienda());
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Cuota> listarCuotas() throws DAOExcepcion {
//		String strAux;
		System.out.println("Collection<Cuota> listarCuotas()");
		Collection<Cuota> c = new ArrayList<Cuota>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
//			String query = "SELECT cuo_periodo, cuo_vivienda, cuo_importe, cuo_fch_vcto, cuo_estado, cuo_fch_pago FROM CUOTA ORDER BY cuo_periodo, cuo_vivienda";
			String query = "SELECT cuo_periodo, cuo_vivienda, viv_ubic_zona, viv_ubic_nro, viv_id_propietario, pers_apellidos, pers_nombres, cuo_importe, " + 
			"cuo_fch_vcto, cuo_estado, cuo_fch_pago " +
			"FROM CUOTA, VIVIENDA, PERSONA " +
			"WHERE CUOTA.cuo_vivienda = VIVIENDA.viv_ID AND VIVIENDA.viv_id_propietario = PERSONA.pers_id " +
			"ORDER BY cuo_periodo, cuo_vivienda";

			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Cuota objCuota = new Cuota();
				objCuota.setStrPeriodo(rs.getString(1));
				objCuota.setIntVivienda(rs.getInt(2));
				objCuota.setNumImporte(rs.getDouble(8));
				objCuota.setStrFechaVcto(rs.getString(9));
				String strCodEstado = rs.getString(10);
				objCuota.setChrEstadoCuota(strCodEstado.charAt(0));
				objCuota.setStrFechaPago(rs.getString(11));
				String strViviendaUbiNro = rs.getString(3) + " " + rs.getString(4);
				objCuota.setStrViviendaNro(strViviendaUbiNro);
				objCuota.setIntPropietarioId(rs.getInt(5));
				String PropietNombre = rs.getString(6) + " " + rs.getString(7);
				objCuota.setStrPropietarioNom(PropietNombre);
// estado de la cuota
				objCuota.setStrEstadoDesc("");
				if (strCodEstado.equals("E")) {
					objCuota.setStrEstadoDesc("EMITIDO");
				}
				if (strCodEstado.equals("P")) {
					objCuota.setStrEstadoDesc("PAGADO");
				}
				if (strCodEstado.equals("V")) {
					objCuota.setStrEstadoDesc("VENCIDO");
				}
				c.add(objCuota);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
